package practice4;

import java.util.Arrays;
import java.util.Scanner;

public class P2302 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //用二进制展开表示口味组合
        int[] dp=new int[1<<20];            //dp[i]表示口味组合为i时最少需要的包数
        int[] arr=new int[101];          //arr[i]表示第i包的口味组合
        Arrays.fill(dp,-1);
        int N=sc.nextInt();             //n包糖果
        int M=sc.nextInt();             //M种口味
        int K=sc.nextInt();             //每包K颗糖果
        for(int i=1;i<=N;i++){
            int zuhe=0;
            for(int j=1;j<=K;j++){
                int num=sc.nextInt();
                zuhe|=1<<(num-1);      //从右往左第i个为1就表示有第i种糖果
            }
            dp[zuhe]=1;
            arr[i]=zuhe;
        }
        int total=(1<<M)-1;      //所有口味糖果的组合
        //遍历所有口味组合
        for(int i=1;i<=total;i++){
            if(dp[i]!=-1){
                //说明i组合存在
                for(int j=1;j<=N;j++){
                    if(dp[i|arr[j]]==-1 || dp[i]+1<dp[i|arr[j]]){
                        //新组合不存在或者新组合所需的包数更少，就进行状态转移
                        dp[i|arr[j]]=dp[i]+1;
                    }
                }
            }
        }
        System.out.println(dp[total]);
    }
}
